<!DOCTYPE html>
<html>
<head>
	<title>03-observer</title>
	<script type="text/javascript" src="js/mummy.js" charset="utf-8"></script>
	
</head>

<body>

<script type="text/javascript" charset="utf-8">
//d'après l'ex du livre "Design Patterns - Tête la 1ère"
Interface(
	function ISujet(){
		this.enregistrerObservateur = function(){};
		this.supprimerObservateur = function(){};
		this.notifierObservateurs = function(){};		
	}
);

Interface(
	function IObservateur(){
		this.actualiser = function(){};
	}
);

Interface(
	function IAffichage(){
		this.afficher = function(){};
	}
);

Class({//DonneesMeteo
	$implements:[ISujet],
	$define:function DonneesMeteo(){
		
		this.observateurs = [];
		this.temperature = 0;
		this.humidite = 0;
		this.pression = 0;
		
		this.DonneesMeteo = function(){
			this.observateurs = new Array();
		};
		
		/* Implementation ISujet*/
		this.enregistrerObservateur = function(obs){
			if($(obs).Implements(IObservateur)){
				this.observateurs.push(obs);
			}else{
				throw "enregistrerObservateur : l'objet n'est pas un Observateur";
			}
		};
		
		this.supprimerObservateur = function(obs){
			if($(obs).Implements(IObservateur)){
				var index = this.observateurs.indexOf(obs);
				if(index>=0){
					delete this.observateurs[index];
				}
			}else{
				throw "supprimerObservateur : l'objet n'est pas un Observateur";
			}			
		};
		
		this.notifierObservateurs = function(){
			for(var i=0; i < this.observateurs.length; i++){
				this.observateurs[i].actualiser(this.temperature,this.humidite,this.pression);
				
			}
		};
		/* Fin Implementation ISujet*/
		
		this.actualiserMesures = function(){
			this.notifierObservateurs();
		};
		
		this.setMesures = function(temperature,humidite,pression){
			this.temperature = temperature;
			this.humidite = humidite;
			this.pression = pression;
			
			this.actualiserMesures();
		}
		
	}
		
});

Class({//AffichageConditions
	$implements:[IObservateur,IAffichage],
	$define:function AffichageConditions(){
		this.temperature = 0;
		this.humidite = 0;
		
		//this.donneesMeteo;
		
		this.AffichageConditions = function(donneesMeteo){
			if($(donneesMeteo).Implements(ISujet)){
				//this.donneesMeteo = donneesMeteo;
				donneesMeteo.enregistrerObservateur(this);
			}else{
				throw "AffichageConditions : l'objet n'est pas un Sujet";
			}
		};
		
		this.actualiser = function(temperature,humidite,pression){
			this.temperature = temperature;
			this.humidite = humidite;
			this.afficher();
		};
		
		this.afficher = function(){
			console.log("Conditions actuelles : "+
				this.temperature+" °C "+
				this.humidite+"% humidité");
		};
		
	}
});

Class({//AffichagePression
	$implements:[IObservateur,IAffichage],
	$define:function AffichagePression(){

		this.pression = 0;
		
		//this.donneesMeteo;
		
		this.AffichagePression = function(donneesMeteo){
			if($(donneesMeteo).Implements(ISujet)){
				//this.donneesMeteo = donneesMeteo;
				donneesMeteo.enregistrerObservateur(this);
			}else{
				throw "AffichagePression : l'objet n'est pas un Sujet";
			}
		};
		
		this.actualiser = function(temperature,humidite,pression){
			this.pression = pression;
			this.afficher();
		};
		
		this.afficher = function(){
			console.log("Pression : "+
				this.pression+" Bar(s)");
		};
		
	}
});

var donneesMeteo = $(DonneesMeteo).getNew();
var affichageConditions = $(AffichageConditions).getNew(donneesMeteo);
var affichagePression = $(AffichagePression).getNew(donneesMeteo);

donneesMeteo.setMesures(26, 65, 1020);
donneesMeteo.setMesures(28, 70, 1012);
donneesMeteo.setMesures(22, 90, 1010);

</script>
	
	

</body>
</html>
